์๋์ ํจ์จ์ฑ์ ์ํด NumPy ์ฝ๋๋ฅผ ์ต์ ํํ์ธ์. ๊ธ๋ก๋ฒ ๊ท๋ชจ์ ๋ฐ์ดํฐ ๊ณผํ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ๊ณ ๊ธ ๋ฒกํฐํ ๊ธฐ์ ์ ๋ฐฐ์ฐ์ธ์. ์ค์ฉ์ ์ธ ์์์ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
Python NumPy ์ฑ๋ฅ: ๊ธ๋ก๋ฒ ๋ฐ์ดํฐ ๊ณผํ์ ์ํ ๋ฒกํฐํ ์ ๋ต ๋ง์คํฐํ๊ธฐ
NumPy๋ Python์์ ๊ณผํ ์ปดํจํ ์ ์ด์์ด๋ฉฐ, ๋ฐฐ์ด ๋ฐ ํ๋ ฌ ์์ ์ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ NumPy์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ํ์ฉํ๋ ค๋ฉด ๋ฒกํฐํ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ดํดํ๊ณ ์ ์ฉํด์ผ ํฉ๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ ํฅ์๋ ์ฑ๋ฅ์ ์ํด NumPy ์ฝ๋๋ฅผ ์ต์ ํํ๋ ๋ฒกํฐํ ์ ๋ต์ ํ๊ตฌํ๋ฉฐ, ์ด๋ ๊ธ๋ก๋ฒ ๋ฐ์ดํฐ ๊ณผํ ํ๋ก์ ํธ์์ ๋ฐ์ํ๋ ๋์์์ด ์ฆ๊ฐํ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๋ฒกํฐํ ์ดํด
๋ฒกํฐํ๋ ๊ฐ๋ณ ์์๋ฅผ ๋ฐ๋ณตํ๋ ๋์ ์ ์ฒด ๋ฐฐ์ด์ ๋ํด ์์ ์ ์ํํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ NumPy ๋ด์์ ์ต์ ํ๋ C ๊ตฌํ์ ํ์ฉํ์ฌ ์คํ ์๊ฐ์ ํฌ๊ฒ ์ค์ ๋๋ค. Python์ ์ธํฐํ๋ฆฌํฐ ํน์ฑ์ผ๋ก ์ธํด ๋งค์ฐ ๋๋ฆฐ Python์ ๋ช ์์ ๋ฃจํ๋ฅผ ํผํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ ๋ณ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์์ ๋๋์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ผ๋ก ์๊ฐํ์ญ์์ค.
๋ธ๋ก๋์บ์คํ ์ ํ
๋ธ๋ก๋์บ์คํ ์ NumPy๊ฐ ์๋ก ๋ค๋ฅธ ๋ชจ์์ ๋ฐฐ์ด์ ๋ํด ์ฐ์ ์ฐ์ฐ์ ์ํํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ๋๋ค. NumPy๋ ๋ ์์ ๋ฐฐ์ด์ ๋ ํฐ ๋ฐฐ์ด์ ๋ชจ์์ ๋ง๊ฒ ์๋์ผ๋ก ํ์ฅํ์ฌ ๋ช ์์ ์ธ ์ฌ๊ตฌ์ฑ์ด ๋ ๋ฃจํ ์์ด ์์๋ณ ์ฐ์ฐ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ ํจ์จ์ ์ธ ๋ฒกํฐํ์ ํ์์ ์ ๋๋ค.
์์:
์ ์ธ๊ณ ์ฌ๋ฌ ๋์์ ์ํ๊ท ๊ธฐ์จ ๋ฐ์ดํฐ ์ธํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์จ๋๋ ์ญ์จ๋ก ํ์๋๋ฉฐ NumPy ๋ฐฐ์ด์ ์ ์ฅ๋ฉ๋๋ค.
import numpy as np
temperatures_celsius = np.array([25, 30, 15, 5, -5, 10]) # Example data
์ด๋ฌํ ์จ๋๋ฅผ ํ์จ๋ก ๋ณํํ๋ ค๊ณ ํฉ๋๋ค. ๊ณต์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: ํ์จ = (์ญ์จ * 9/5) + 32.
๋ฒกํฐํ ๋ฐ ๋ธ๋ก๋์บ์คํ ์ ์ฌ์ฉํ๋ฉด ์ด ๋ณํ์ ๋จ์ผ ์ฝ๋ ์ค๋ก ์ํํ ์ ์์ต๋๋ค.
temperatures_fahrenheit = (temperatures_celsius * 9/5) + 32
print(temperatures_fahrenheit)
์ด๊ฒ์ `temperatures_celsius` ๋ฐฐ์ด์ ๋ฐ๋ณตํ๊ณ ๊ฐ ์์์ ๊ณต์์ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฆ ๋๋ค.
๋ฒกํฐํ ๊ธฐ์
๋ค์์ ๋ฒกํฐํ๋ฅผ ํตํด NumPy ์ฝ๋์ ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ๋ช ๊ฐ์ง ๊ธฐ์ ์ ๋๋ค.
1. ์ ๋๋ฒ์ค ํจ์(UFuncs)
NumPy๋ ๋ฐฐ์ด์ ๋ํ ์์๋ณ ์ฐ์ฐ์ ์ํํ๋ ํ๋ถํ ์ ๋๋ฒ์ค ํจ์(UFuncs) ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ํจ์๋ ๊ณ ๋๋ก ์ต์ ํ๋์ด ์์ผ๋ฉฐ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ช ์์ ๋ฃจํ๋ณด๋ค ์ ํธ๋์ด์ผ ํฉ๋๋ค. ์์์๋ `np.add()`, `np.subtract()`, `np.multiply()`, `np.divide()`, `np.sin()`, `np.cos()`, `np.exp()` ๋ฑ์ด ์์ต๋๋ค.
์์: ๋ฐฐ์ด์ ์ฌ์ธ ๊ณ์ฐ
import numpy as np
angels_degrees = np.array([0, 30, 45, 60, 90])
angels_radians = np.radians(angels_degrees) # Convert to radians
sines = np.sin(angels_radians)
print(sines)
`np.sin()`์ ์ฌ์ฉํ๋ฉด ๊ฐ ๊ฐ๋์ ์ฌ์ธ์ ๊ณ์ฐํ๋ ๋ฃจํ๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฆ ๋๋ค.
2. ๋ถ์ธ ์ธ๋ฑ์ฑ
๋ถ์ธ ์ธ๋ฑ์ฑ์ ์ฌ์ฉํ๋ฉด ๋ถ์ธ ์กฐ๊ฑด์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐ์ด์์ ์์๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ์ด๋ ๋ฃจํ ์์ด ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๊ณ ์กฐ๊ฑด๋ถ ์ฐ์ฐ์ ์ํํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค.
์์: ์๊ณ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ ์ ํ
๋ค์ํ ์์น์์ ์ธก์ ํ ๋๊ธฐ ์ง ๋ฐ์ดํฐ ์ธํธ๊ฐ ์์ผ๋ฉฐ ์ค์ผ ์์ค์ด ํน์ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ ์์น๋ฅผ ์๋ณํ๋ ค๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
import numpy as np
pollution_levels = np.array([10, 25, 5, 35, 15, 40]) # Example data
threshold = 30
# Find locations where pollution level exceeds the threshold
high_pollution_locations = pollution_levels > threshold
print(high_pollution_locations)
# Select the actual pollution levels at those locations
high_pollution_values = pollution_levels[high_pollution_locations]
print(high_pollution_values)
์ด ์ฝ๋๋ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ ์ค์ผ ์์ค์ ํจ์จ์ ์ผ๋ก ์๋ณํ๊ณ ์ถ์ถํฉ๋๋ค.
3. ๋ฐฐ์ด ์ง๊ณ
NumPy๋ `np.sum()`, `np.mean()`, `np.max()`, `np.min()`, `np.std()`, `np.var()`์ ๊ฐ์ ๋ฐฐ์ด์ ๋ํ ์ง๊ณ๋ฅผ ์ํํ๋ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ํจ์๋ ์ ์ฒด ๋ฐฐ์ด์ ๋ํด ์๋ํ๋ฉฐ ๊ณ ๋๋ก ์ต์ ํ๋์ด ์์ต๋๋ค.
์์: ํ๊ท ์จ๋ ๊ณ์ฐ
์๋ณ ์จ๋์ ์์๋ฅผ ๊ณ์ํด์, ๋ชจ๋ ๋์์ ํ๊ท ์จ๋๋ฅผ ๊ณ์ฐํด ๋ณด๊ฒ ์ต๋๋ค.
import numpy as np
temperatures_celsius = np.array([25, 30, 15, 5, -5, 10]) # Example data
average_temperature = np.mean(temperatures_celsius)
print(average_temperature)
์ด๊ฒ์ ์ ์ฒด ๋ฐฐ์ด์ ํ๊ท ์ ๊ณ์ฐํ๋ ๋งค์ฐ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
4. ๋ช ์์ ๋ฃจํ ๋ฐฉ์ง
์์ ์ธ๊ธํ๋ฏ์ด, ๋ช ์์ Python ๋ฃจํ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฒกํฐํ๋ ์ฐ์ฐ์ ๋นํด ๋๋ฆฝ๋๋ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ `for` ๋ฃจํ ๋๋ `while` ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ๋์ , NumPy์ ๋ด์ฅ ํจ์ ๋ฐ ๋ธ๋ก๋์บ์คํ ๊ธฐ๋ฅ์ ํ์ฉํ์ญ์์ค.
์์: ์ด๊ฒ ๋์ (๋๋ฆผ):
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
squared_arr = np.array([0, 0, 0, 0, 0]) # Initialize
for i in range(len(arr)):
squared_arr[i] = arr[i]**2
print(squared_arr)
์ด๋ ๊ฒ ํ์ธ์(๋น ๋ฆ):
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
squared_arr = arr**2
print(squared_arr)
๋ ๋ฒ์งธ ์์๋ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ํ ๋ฒ์ ์ ๊ณฑํ๋ ๋ฒกํฐํ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๋น ๋ฆ ๋๋ค.
5. ์ ์๋ฆฌ ์ฐ์ฐ
์ ์๋ฆฌ ์ฐ์ฐ์ ์ ๋ณต์ฌ๋ณธ์ ์์ฑํ์ง ์๊ณ ๋ฐฐ์ด์ ์ง์ ์์ ํฉ๋๋ค. ์ด๋ ํนํ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ก ์์ ํ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. NumPy๋ `+=`, `-=`, `*=`, `/=`์ ๊ฐ์ ๋ง์ ์ผ๋ฐ์ ์ธ ์ฐ์ฐ์ ์ ์๋ฆฌ ๋ฒ์ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉํ ๋๋ ๋ถ์์ฉ์ ์ ์ํ์ญ์์ค.
์์: ์ ์๋ฆฌ์์ ๋ฐฐ์ด ์์ ์ฆ๊ฐ
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
arr += 1 # In-place addition
print(arr)
์ด๊ฒ์ ์๋ `arr` ๋ฐฐ์ด์ ์ง์ ์์ ํฉ๋๋ค.
6. `np.where()` ํ์ฉ
`np.where()`๋ ์กฐ๊ฑด์ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฐฐ์ด์ ์์ฑํ๊ธฐ ์ํ ๋ค์ฉ๋ ํจ์์ ๋๋ค. ์กฐ๊ฑด๊ณผ ๋ ๊ฐ์ ๋ฐฐ์ด์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ์์์ ๋ํ ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ์ฒซ ๋ฒ์งธ ๋ฐฐ์ด์ ํด๋น ์์๊ฐ ์ฌ์ฉ๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ๋ฒ์งธ ๋ฐฐ์ด์ ์์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์์: ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฐ ๋ฐ๊พธ๊ธฐ
์ผ์ ํ๋ ๊ฐ์ ํฌํจํ๋ ๋ฐ์ดํฐ ์ธํธ๊ฐ ์๊ณ , ์ผ๋ถ ํ๋ ๊ฐ์ด ์ค๋ฅ๋ก ์ธํด ์์์ธ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ชจ๋ ์์ ํ๋ ๊ฐ์ 0์ผ๋ก ๋ฐ๊พธ๊ณ ์ถ์ต๋๋ค.
import numpy as np
sensor_readings = np.array([10, -5, 20, -2, 15]) # Example data
# Replace negative readings with 0
corrected_readings = np.where(sensor_readings < 0, 0, sensor_readings)
print(corrected_readings)
์ด๊ฒ์ ๋ชจ๋ ์์ ๊ฐ์ ํจ์จ์ ์ผ๋ก 0์ผ๋ก ๋ฐ๊ฟ๋๋ค.
7. ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ ๋ฐ ์ฐ์์ฑ
NumPy ๋ฐฐ์ด์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ ๋ฐฉ์์ ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์์๊ฐ ์ฐ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ ์ฅ๋๋ ์ฐ์ ๋ฐฐ์ด์ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋น ๋ฅธ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. NumPy๋ ๋ฐฐ์ด์ด ์ฐ์๋๋๋ก `np.ascontiguousarray()`์ ๊ฐ์ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฐ์ฐ์ ์ํํ ๋ NumPy๋ C ์คํ์ผ ์ฐ์์ฑ(ํ ์ฐ์ ์์)์ ์ ํธํ์ง๋ง Fortran ์คํ์ผ ์ฐ์์ฑ(์ด ์ฐ์ ์์)๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์: ์ฐ์ ๋ฐฐ์ด ํ์ธ ๋ฐ ๋ณํ
import numpy as np
arr = np.array([[1, 2], [3, 4]])
print(arr.flags['C_CONTIGUOUS'])
arr_transposed = arr.T # Transpose the array
print(arr_transposed.flags['C_CONTIGUOUS'])
arr_contiguous = np.ascontiguousarray(arr_transposed)
print(arr_contiguous.flags['C_CONTIGUOUS'])
๋ฐฐ์ด์ ์ ์นํ๋ฉด ์ข ์ข ๋น์ฐ์ ๋ฐฐ์ด์ด ์์ฑ๋ฉ๋๋ค. `np.ascontiguousarray()`๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
ํ๋กํ์ผ๋ง ๋ฐ ๋ฒค์น๋งํน
์ฝ๋๋ฅผ ์ต์ ํํ๊ธฐ ์ ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํ๋กํ์ผ๋ง ๋๊ตฌ๋ ์ฝ๋๊ฐ ๊ฐ์ฅ ๋ง์ ์๊ฐ์ ์๋นํ๋ ๋ถ๋ถ์ ์ ํํ ์ฐพ์๋ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ฒค์น๋งํน์ ํตํด ์๋ก ๋ค๋ฅธ ๊ตฌํ์ ์ฑ๋ฅ์ ๋น๊ตํ ์ ์์ต๋๋ค.
Jupyter Notebook์์ `%timeit` ์ฌ์ฉ
Jupyter Notebook์ ๋จ์ผ ์ฝ๋ ์ค์ ์คํ ์๊ฐ์ ์ธก์ ํ๊ธฐ ์ํ `%timeit` ๋งค์ง ๋ช ๋ น์ ์ ๊ณตํฉ๋๋ค. ์ด๊ฒ์ ์๋ก ๋ค๋ฅธ ๋ฒกํฐํ ์ ๋ต์ ์ฑ๋ฅ์ ๋น๊ตํ๋ ๋น ๋ฅด๊ณ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค.
์์: ๋ฃจํ vs. ๋ฒกํฐํ๋ ๋ง์ ๋น๊ต
import numpy as np
arr = np.random.rand(1000000)
# Loop-based addition
def loop_addition(arr):
result = np.zeros_like(arr)
for i in range(len(arr)):
result[i] = arr[i] + 1
return result
# Vectorized addition
def vectorized_addition(arr):
return arr + 1
# Benchmarking using %timeit
# %timeit loop_addition(arr)
# %timeit vectorized_addition(arr)
Jupyter Notebook์์ ์ด๋ฌํ `%timeit` ๋ช ๋ น์ ์คํํฉ๋๋ค. ๋ฒกํฐํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ฑ๋ฅ ์ด์ ์ ๋ช ํํ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
`cProfile` ์ฌ์ฉ
`cProfile` ๋ชจ๋์ ๊ฐ ํจ์ ํธ์ถ์ ์์๋ ์๊ฐ์ ํฌํจํ์ฌ ๋ ์์ธํ ํ๋กํ์ผ๋ง ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์: ํจ์ ํ๋กํ์ผ๋ง
import cProfile
import numpy as np
def my_function():
arr = np.random.rand(1000000)
result = np.sin(arr) # A sample operation
return result
# Profile the function
cProfile.run('my_function()')
์ด๋ ๊ฒ ํ๋ฉด `my_function()` ๋ด์ ๊ฐ ํจ์์ ์์๋ ์๊ฐ์ ๋ณด์ฌ์ฃผ๋ ์์ธํ ๋ณด๊ณ ์๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ์ด๋ ์ต์ ํ ์์ญ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ค์ ์์ ๋ฐ ๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
๋ฒกํฐํ๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๋ฐ์ดํฐ ๊ณผํ ์์ฉ ํ๋ก๊ทธ๋จ์ ํ์์ ์ ๋๋ค.
- ์ด๋ฏธ์ง ์ฒ๋ฆฌ: ํํฐ๋ง, ๊ฐ์ฅ์๋ฆฌ ๊ฐ์ง, ์ด๋ฏธ์ง ํฅ์๊ณผ ๊ฐ์ ์์ ์ ์ํด ์ ์ฒด ์ด๋ฏธ์ง(NumPy ๋ฐฐ์ด๋ก ํ์๋จ)์ ๋ํ ์ฐ์ฐ์ ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ๋ฝ ์ฐ์ฃผ๊ตญ(European Space Agency)์ Sentinel ์๋ฌด์์ ์ป์ ์์ฑ ์ด๋ฏธ์ง์ ์ ๋ช ํ ํํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
- ๋จธ์ ๋ฌ๋: ๋ ๋น ๋ฅธ ํ๋ จ ๋ฐ ์์ธก์ ์ํด ๋ฒกํฐํ๋ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ธ๋ก๋ฒ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ ๋๊ท๋ชจ ๊ณ ๊ฐ ๊ฑฐ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ ํ๊ท ๋ชจ๋ธ์ ๋ํ ๊ธฐ์ธ๊ธฐ ๊ฐํ ์ ๋ฐ์ดํธ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ๊ธ์ต ๋ชจ๋ธ๋ง: ์ฃผ๊ฐ ๋๋ ์ต์ ๊ฐ๊ฒฉ๊ณผ ๊ฐ์ ๋๊ท๋ชจ ๊ธ์ต ๋ฐ์ดํฐ ์ธํธ์ ๋ํ ์๋ฎฌ๋ ์ด์ ๋ฐ ๊ณ์ฐ์ ์ํํฉ๋๋ค. ์๋ก ๋ค๋ฅธ ๊ฑฐ๋์(์: NYSE, LSE, TSE)์ ์ฃผ์ ์์ฅ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ฌ ์ฐจ์ต ๊ฑฐ๋ ๊ธฐํ๋ฅผ ์๋ณํฉ๋๋ค.
- ๊ณผํ ์๋ฎฌ๋ ์ด์ : ๋ ์จ ์์ธก ๋๋ ์ ์ฒด ์ญํ๊ณผ ๊ฐ์ ๋ฌผ๋ฆฌ์ ์์คํ ์ ์๋ฎฌ๋ ์ด์ ์ ์คํํฉ๋๋ค. ๊ธ๋ก๋ฒ ๊ธฐํ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๊ธฐํ ๋ณํ ์๋๋ฆฌ์ค๋ฅผ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค.
๊ธ๋ก๋ฒ ๋ฐ์ดํฐ ์ธํธ๋ก ์์ ํ ๋๋ ๋ค์ ์ฌํญ์ ๊ณ ๋ คํ์ญ์์ค.
- ๋ฐ์ดํฐ ํ์: ์๋ก ๋ค๋ฅธ ์ง์ญ์์ ์ฌ์ฉ๋๋ ๋ค์ํ ๋ฐ์ดํฐ ํ์์ ์ธ์ํฉ๋๋ค. `pandas`์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ํ์ผ ์ธ์ฝ๋ฉ ๋ฐ ๋ ์ง ํ์์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์๊ฐ๋: ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ ๋ ์๋ก ๋ค๋ฅธ ์๊ฐ๋๋ฅผ ๊ณ ๋ คํฉ๋๋ค. `pytz`์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ๋ ๊ฐ์ ๋ณํํฉ๋๋ค.
- ํตํ: ๊ธ์ต ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ค์ํ ํตํ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. API๋ฅผ ์ฌ์ฉํ์ฌ ํตํ ๊ฐ์ ๋ณํํฉ๋๋ค.
- ๋ฌธํ์ ์ฐจ์ด: ๋ฐ์ดํฐ๋ฅผ ํด์ํ ๋ ๋ฌธํ์ ์ฐจ์ด์ ์ ์ํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ์๋ก ๋ค๋ฅธ ๋ฌธํ๊ถ์ ์ํ์ ๋ํ ์ธ์์ด ๋ค๋ฅด๊ฑฐ๋ ์ ํ ๋ฐ ์๋น์ค์ ๋ํ ์ ํธ๋๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค.
๊ณ ๊ธ ๋ฒกํฐํ ๊ธฐ์
NumPy์ `einsum` ํจ์
`np.einsum`(์์ธ์ํ์ธ ํฉ์ฐ)์ ํ๋ ฌ ๊ณฑ์ , ์ถ์ , ์ถ์ ๋ฐ๋ผ ํฉ๊ณ ๋ฑ์ ํฌํจํ์ฌ ๋ง์ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด ์ฐ์ฐ์ ํํํ๋ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ ํจ์์ ๋๋ค. ๋ ๊ฐํ๋ฅธ ํ์ต ๊ณก์ ์ ๊ฐ์ง ์ ์์ง๋ง `einsum`์ ๋ง์คํฐํ๋ฉด ๋ณต์กํ ์ฐ์ฐ์ ๋ํ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ป์ ์ ์์ต๋๋ค.
์์: `einsum`์ ์ฌ์ฉํ ํ๋ ฌ ๊ณฑ์
import numpy as np
A = np.random.rand(3, 4)
B = np.random.rand(4, 5)
# Matrix multiplication using einsum
C = np.einsum('ij,jk->ik', A, B)
# Equivalent to:
# C = np.matmul(A, B)
print(C.shape)
๋ฌธ์์ด `'ij,jk->ik'`๋ ์ ๋ ฅ ๋ฐฐ์ด ๋ฐ ์ถ๋ ฅ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํฉ๋๋ค. `i`, `j` ๋ฐ `k`๋ ๋ฐฐ์ด์ ์ฐจ์์ ๋ํ๋ ๋๋ค. `ij,jk`๋ `j` ์ฐจ์์ ๋ฐ๋ผ ๋ฐฐ์ด `A`์ `B`๋ฅผ ๊ณฑํ๊ณ ์์์ ๋ํ๋ด๋ฉฐ `->ik`๋ ์ถ๋ ฅ ๋ฐฐ์ด `C`์ ์ฐจ์์ด `i`์ `k`์ฌ์ผ ํจ์ ๋ํ๋ ๋๋ค.
NumExpr
NumExpr๋ NumPy ๋ฐฐ์ด๊ณผ ๊ด๋ จ๋ ์ซ์ ํํ์์ ํ๊ฐํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์๋์ผ๋ก ํํ์์ ๋ฒกํฐํํ๊ณ ๋ฉํฐ ์ฝ์ด ํ๋ก์ธ์๋ฅผ ํ์ฉํ ์ ์์ผ๋ฏ๋ก ์ข ์ข ์๋นํ ์๋ ํฅ์์ ๊ฐ์ ธ์ต๋๋ค. ๋ง์ ์ฐ์ ์ฐ์ฐ๊ณผ ๊ด๋ จ๋ ๋ณต์กํ ํํ์์ ํนํ ์ ์ฉํฉ๋๋ค.
์์: ๋ณต์กํ ๊ณ์ฐ์ NumExpr ์ฌ์ฉ
import numpy as np
import numexpr as ne
a = np.random.rand(1000000)
b = np.random.rand(1000000)
c = np.random.rand(1000000)
# Calculate a complex expression using NumExpr
result = ne.evaluate('a * b + c**2')
# Equivalent to:
# result = a * b + c**2
NumExpr์ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ง์ ์ค๊ฐ ๋ฐฐ์ด์ ์์ฑํด์ผ ํ๋ ํํ์์ ํนํ ์ ์ฉํ ์ ์์ต๋๋ค.
Numba
Numba๋ Python ์ฝ๋๋ฅผ ์ต์ ํ๋ ๊ธฐ๊ณ์ด๋ก ๋ณํํ ์ ์๋ JIT(Just-In-Time) ์ปดํ์ผ๋ฌ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก NumPy์ ๋ด์ฅ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๋ฒกํฐํํ ์ ์๋ ๋ฃจํ์ ๊ด๋ จ๋ ์ซ์ ๊ณ์ฐ์ ๊ฐ์ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. Python ํจ์์ `@njit`๋ฅผ ์ฅ์ํ๋ฉด Numba๋ C ๋๋ Fortran๊ณผ ๋น์ทํ ์๋๋ก ์คํ๋๋๋ก ์ปดํ์ผํ ์ ์์ต๋๋ค.
์์: ๋ฃจํ๋ฅผ ๊ฐ์ํํ๊ธฐ ์ํด Numba ์ฌ์ฉ
import numpy as np
from numba import njit
@njit
def calculate_sum(arr):
total = 0.0
for i in range(arr.size):
total += arr[i]
return total
arr = np.random.rand(1000000)
result = calculate_sum(arr)
print(result)
Numba๋ ๋ช ์์ ๋ฃจํ ๋ฐ ๋ณต์กํ ์ซ์ ๊ณ์ฐ์ด ํฌํจ๋ ํจ์๋ฅผ ๊ฐ์ํํ๋ ๋ฐ ํนํ ํจ๊ณผ์ ์ ๋๋ค. ํจ์๊ฐ ์ฒ์ ํธ์ถ๋๋ฉด Numba๊ฐ ์ด๋ฅผ ์ปดํ์ผํฉ๋๋ค. ํ์ ํธ์ถ์ ํจ์ฌ ๋น ๋ฆ ๋๋ค.
๊ธ๋ก๋ฒ ํ์ ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๊ธ๋ก๋ฒ ํ๊ณผ ๋ฐ์ดํฐ ๊ณผํ ํ๋ก์ ํธ๋ฅผ ์งํํ ๋ ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ๋ฒ์ ๊ด๋ฆฌ: Git๊ณผ ๊ฐ์ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ฐ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ ๊ตฌ์ฑ์์ด ํจ๊ณผ์ ์ผ๋ก ํ์ ํ๊ณ ์ถฉ๋์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ์ฝ๋ ๊ฒํ : ์ฝ๋ ๊ฒํ ๋ฅผ ์ํํ์ฌ ์ฝ๋ ํ์ง๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ฅผ ์๋ณํ๊ณ ์ฝ๋์ ์ ๋ฐ์ ์ธ ์ค๊ณ๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๋ฌธ์ํ: ์ฝ๋ ๋ฐ ๋ฐ์ดํฐ์ ๋ํ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ํ ๊ตฌ์ฑ์์ด ์์ ์ ์ดํดํ๊ณ ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
- ํ ์คํธ: ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ํ๊ท๋ฅผ ๋ฐฉ์งํ๊ณ ์ฝ๋๊ฐ ์์ ์ ์ธ์ง ํ์ธํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ปค๋ฎค๋์ผ์ด์ : ํจ๊ณผ์ ์ธ ์ปค๋ฎค๋์ผ์ด์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ ๊ตฌ์ฑ์๊ณผ ์ฐ๋ฝ์ ์ ์งํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ ์ฌ๋์ด ๊ฐ์ ํ์ด์ง์ ์๊ณ ๋ชจ๋ ๋ฌธ์ ๊ฐ ์ ์ํ๊ฒ ํด๊ฒฐ๋๋๋ก ํ ์ ์์ต๋๋ค. Slack, Microsoft Teams, Zoom๊ณผ ๊ฐ์ ๋๊ตฌ๋ ๊ธ๋ก๋ฒ ํ์ ์ ํ์์ ์ ๋๋ค.
- ์ฌํ์ฑ: Docker ๋๋ Conda์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌํ ๊ฐ๋ฅํ ํ๊ฒฝ์ ๋ง๋ญ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ์๋ก ๋ค๋ฅธ ํ๋ซํผ ๋ฐ ํ๊ฒฝ์์ ์ผ๊ด๋๊ฒ ์คํ๋ฉ๋๋ค. ์ด๋ ์๋ก ๋ค๋ฅธ ์ํํธ์จ์ด ๊ตฌ์ฑ์ ๊ฐ์ง ๊ณต๋ ์์ ์์ ์์ ์ ๊ณต์ ํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ๋ฐ์ดํฐ ๊ฑฐ๋ฒ๋์ค: ๋ฐ์ดํฐ๊ฐ ์ค๋ฆฌ์ ์ด๊ณ ์ฑ ์๊ฐ ์๊ฒ ์ฌ์ฉ๋๋๋ก ๋ช ํํ ๋ฐ์ดํฐ ๊ฑฐ๋ฒ๋์ค ์ ์ฑ ์ ์๋ฆฝํฉ๋๋ค. ์ด๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ก ์์ ํ ๋ ํนํ ์ค์ํฉ๋๋ค.
๊ฒฐ๋ก
๋ฒกํฐํ๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ ํจ์จ์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ NumPy ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๊ฐ์ด๋์์ ์ค๋ช ํ ๊ธฐ์ ์ ์ดํดํ๊ณ ์ ์ฉํ๋ฉด ๋ฐ์ดํฐ ๊ณผํ ์ํฌํ๋ก์ฐ์ ์๋๋ฅผ ํฌ๊ฒ ๋์ด๊ณ ๋ ํฌ๊ณ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ๋ฐ์ดํฐ ๊ณผํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ NumPy ์ฑ๋ฅ ์ต์ ํ๋ ๋ ๋น ๋ฅธ ํต์ฐฐ๋ ฅ, ๋ ๋์ ๋ชจ๋ธ, ๊ถ๊ทน์ ์ผ๋ก ๋ ์ํฅ๋ ฅ ์๋ ์๋ฃจ์ ์ผ๋ก ์ง์ ๋ณํ๋ฉ๋๋ค. ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๊ณ , ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๋ฒค์น๋งํนํ๊ณ , ํน์ ์๊ตฌ ์ฌํญ์ ๊ฐ์ฅ ์ ํฉํ ๋ฒกํฐํ ๊ธฐ์ ์ ์ ํํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ๋ฐ์ดํฐ ํ์, ์๊ฐ๋, ํตํ ๋ฐ ๋ฌธํ์ ์ฐจ์ด์ ๊ด๋ จ๋ ๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ์ ์ผ๋์ ๋์ญ์์ค. ์ด๋ฌํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฑํํ์ฌ ์ธ๊ณํ๋ ์ธ๊ณ์ ๊ณผ์ ๋ฅผ ํด๊ฒฐํ ์ค๋น๊ฐ ๋ ๊ณ ์ฑ๋ฅ ๋ฐ์ดํฐ ๊ณผํ ์๋ฃจ์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ ๋ต์ ์ดํดํ๊ณ ์ํฌํ๋ก์ฐ์ ํตํฉํจ์ผ๋ก์จ NumPy ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๊ณผํ ํ๋ก์ ํธ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์์ผ ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ถ์ํ ์ ์์ต๋๋ค. ํญ์ ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๊ณ ํน์ ๋ฌธ์ ์ ๋ํ ์ต์ ์ ์๋ฃจ์ ์ ์ฐพ๊ธฐ ์ํด ๋ค์ํ ๊ธฐ์ ์ ์คํํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.